home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 001-025 / disk_024 / csh / set.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  3KB  |  149 lines

  1.  
  2. /*
  3.  * SET.C
  4.  *
  5.  * Matthew Dillon, 28 Apr 1986
  6.  *
  7.  */
  8.  
  9. #include "shell.h"
  10. #define MAXLEVELS (3 + MAXSRC)
  11.  
  12. struct MASTER {
  13.    struct MASTER *next;
  14.    struct MASTER *last;
  15.    char *name;
  16.    char *text;
  17. };
  18.  
  19. static struct MASTER *Mbase[MAXLEVELS];
  20.  
  21. char *
  22. set_var(level, name, str)
  23. register char *name, *str;
  24. {
  25.    register struct MASTER *base = Mbase[level];
  26.    register struct MASTER *last;
  27.  
  28.    while (base != NULL) {
  29.       if (strcmp (name, base->name) == 0) {
  30.          Free (base->text);
  31.          goto gotit;
  32.       }
  33.       last = base;
  34.       base = base->next;
  35.    }
  36.    if (base == Mbase[level]) {
  37.       base = Mbase[level] = (struct MASTER *)malloc (sizeof(struct MASTER));
  38.       base->last = NULL;
  39.    } else {
  40.       base = (struct MASTER *)malloc (sizeof(struct MASTER));
  41.       base->last = last;
  42.       last->next = base;
  43.    }
  44.    base->name = malloc (strlen(name) + 1);
  45.    strcpy (base->name, name);
  46.    base->next = NULL;
  47. gotit:
  48.    base->text = malloc (strlen(str) + 1);
  49.    strcpy (base->text, str);
  50.    return (base->text);
  51. }
  52.  
  53. char *
  54. get_var (level, name)
  55. register char *name;
  56. {
  57.    register struct MASTER *base = Mbase[level];
  58.  
  59.    while (base != NULL) {
  60.       if (strcmp (name, base->name) == 0)
  61.          return (base->text);
  62.       base = base->next;
  63.    }
  64.    return (NULL);
  65. }
  66.  
  67. unset_level(level)
  68. {
  69.    register struct MASTER *base = Mbase[level];
  70.  
  71.    while (base) {
  72.       Free (base->name);
  73.       Free (base->text);
  74.       Free (base);
  75.       base = base->next;
  76.    }
  77.    Mbase[level] = NULL;
  78. }
  79.  
  80. unset_var(level, name)
  81. char *name;
  82. {
  83.    register struct MASTER *base = Mbase[level];
  84.    register struct MASTER *last = NULL;
  85.  
  86.    while (base) {
  87.       if (strcmp (name, base->name) == 0) {
  88.          if (base != Mbase[level])
  89.             last->next = base->next;
  90.          else
  91.             Mbase[level] = base->next;
  92.          if (base->next != NULL)
  93.             base->next->last = last;
  94.          if (base == Mbase[level])
  95.             Mbase[level] = base->next;
  96.          Free (base->name);
  97.          Free (base->text);
  98.          Free (base);
  99.          return (1);
  100.       }
  101.       last = base;
  102.       base = base->next;
  103.    }
  104.    return (-1);
  105. }
  106.  
  107.  
  108. do_unset_var(str, level)
  109. char *str;
  110. {
  111.    int i;
  112.  
  113.    for (i = 1; i < ac; ++i)
  114.       unset_var (level, av[i]);
  115.    return (1);
  116. }
  117.  
  118. do_set_var(command, level)
  119. char *command;
  120. {
  121.    register struct MASTER *base = Mbase[level];
  122.    register char *str;
  123.  
  124.    if (ac == 1) {
  125.       while (base) {
  126.          printf ("%-10s ", base->name);
  127.          puts (base->text);
  128.          base = base->next;
  129.       }
  130.       return (1);
  131.    }
  132.    if (ac == 2) {
  133.       str = get_var (level, av[1]);
  134.       if (str)
  135.          printf ("%-10s %s\n", av[1], str);
  136.       else
  137.          set_var (level, av[1], "");
  138.    }
  139.    if (ac > 2)
  140.       set_var (level, av[1], next_word (next_word (command)));
  141.    if (*av[1] == '_') {
  142.       S_histlen = (str = get_var(LEVEL_SET, V_HIST)) ? atoi(str) : 0;
  143.  
  144.       if (S_histlen < 2)   S_histlen = 2;
  145.    }
  146.    return (1);
  147. }
  148.  
  149.